#ifndef _GOVT_VISITOR_HPP_
#define _GOVT_VISITOR_HPP_

/*******************************************************************************
 ** Name: visitor.hpp                                                       **
 ** Description:                                                              **
 **                                                                           **
 ** Open Source Initiative (OSI) Approved CDDL License                        **
 **                                                                           **
 **  Copyright (c) 2009-2011 B Gian James  <soap@government-sanctioned.us>    **
 **  All rights reserved.                                                     **
 **                                                                           **
 **  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS      **
 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED **
 ** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           **
 ** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT        **
 ** HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,    **
 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED  **
 ** TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR    **
 ** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    **
 ** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      **
 ** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        **
 ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              **
 **                                                                           **
 ******************************************************************************/
// Portions (c) 2012 Open Design Strategies, LLC.
// Created on April 4, 2010, 10:03 AM
// Modified $Date$ by $Author$
#define visitor_hpp_ID   "$Id$"

#include "common.hpp"

class WorldObject;
class Item;
class Weapon;
class Vehicle;
class Device;
class Container;
class Room;
class PC;
class NPC;


namespace Pattern
{
class WorldObject;
// Visitor pattern support interfaces
// Classes derived from Visitor 'visit' WorldObjects
// and do some action upon them
// Primarily designed and created to support visiting commands temporarily
// to characters, but may be extended to support visiting events on characters,
// items, rooms, etc.

//! @class Visitor
//! @brief The abstract Visitor base class for the visitor pattern
class Visitor
{
public:
	virtual ~Visitor() { }
	// This one may not be necessary
	virtual int		visit(WorldObject * obj) = 0;
	virtual void	visit(Item * i) = 0;
	virtual void	visit(Weapon * w) = 0;
	virtual void	visit(Vehicle * v) = 0;
	virtual void	visit(Device * d) = 0;
	virtual void	visit(Container * c) = 0;
	virtual void	visit(Room * r) = 0;

	//---------------------------

	virtual void	visit(PC * p) = 0;
	virtual void	visit(NPC * n) = 0;

};


}

#endif /* VISITOR_HPP_ */
